iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0

後面十天的 Streamlit 小專案會放在 GitHub 上,有興趣的朋友歡迎留言 or 來信討論,我的信箱是 nickchen1998@gmail.com

今天我們要來製作對話紀錄的功能,廢話不多說,我們馬上開始吧!

對話紀錄

首先第一個,我們要來製作呈現對話紀錄的功能,直到昨天為止,我們每問一個問題,就會把之前的對話洗掉,
今天我們要來使用 session 來存放我們的對話紀錄,並且在切換資料集的時候會把對話紀錄清空。

  • 初始化 session_state 參數:

    history 用於存放對話紀錄,而 selected_dataset 則用來暫存使用者選擇的資料集,預設為 “排便問題”。

import streamlit as st

datasets = {...}

# 初始化對話紀錄及選定資料集
if 'history' not in st.session_state:
    st.session_state['history'] = []
if 'selected_dataset' not in st.session_state:
    st.session_state['selected_dataset'] = "排便問題"

with st.sidebar:
    ...
  • 切換資料集時清空對話紀錄:
with st.sidebar:
    ...

# 當資料集切換時,刪除對話紀錄
if dataset_option != st.session_state['selected_dataset']:
    st.session_state['selected_dataset'] = dataset_option
    st.session_state['history'] = []

st.title("問答機器人")
...
  • 對話後新增對話紀錄並且顯示:

    可以看到我們在塞入 ai 回覆的時候,除了將 role 及 content 塞入之外,還多塞了一個 references 欄位,這部分是為了明天要輸出對話紀錄的時候所做的預先動作,方便我們在看對話紀錄的時候能回朔到原始資料。

if question and openai_key:
    ...
    st.session_state['history'].append({
        "role": "user",
        "content": question
    })
    st.session_state['history'].append({
        "role": "ai", 
        "content": answer,
        "references": [doc.metadata.get("refactor_answer") for doc in documents]
    })
    for message in st.session_state['history']:
        with st.chat_message(message['role']):
            st.write(message['content'])

elif question and not openai_key:
    ...
  • 結果呈現:

    完成到這邊後就可以讓對話紀錄接續呈現了,下方附上效果圖。

    log history result

內容預告

今天我們把對話紀錄呈現的功能實作上去了,明天我們要來做最後一步,輸出對話紀錄。


上一篇
Day 27 - 查詢 & 串接問答
下一篇
Day 29 - 對話紀錄下載
系列文
初探 Langchain 與 LLM:打造簡易問診機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言